/*
 * stepper_driver.c
 *
 *  Created on: Feb 1, 2025
 *      Author: wzx05
 */

#include <Motor\stepper_driver.h>
#include <Motor\stepper_cfg.h>

// 定义两种常用的步进序列
// static const uint8_t common_full_step_4phase[] = {0x01, 0x02, 0x04, 0x08};
static const uint8_t common_half_step_8phase[] = {0x09, 0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08};

const MotorSpec MOTOR_24BYJ48 = {
    .gear_ratio = 64.0f,
    .steps_per_rev = 32,   // 内部步数，28BYJ-48一般为32步/圈（实际输出4096步/圈需乘上减速比和半步模式的2倍步数）
    .step_mode = 1,        // 半步模式
    .phase_seq = common_half_step_8phase,
    .phase_count = sizeof(common_half_step_8phase) / sizeof(common_half_step_8phase[0]),
	.idle_pattern = 0x00
};

/* 如果需要，可以实现 Stepper_ReconfigMotor() 接口，
   例如根据传入的 group 与 motor 修改 motor_state 数组中的 spec 参数 */
void Stepper_ReconfigMotor(uint8_t group, uint8_t motor, const MotorSpec* new_spec) {
    // 此函数需要访问 motor_state 数组，请确保在调用前已正确初始化
    extern MotorState motor_state[MOTOR_GROUPS][MOTORS_PER_GROUP];
    if (group >= MOTOR_GROUPS || motor >= MOTORS_PER_GROUP || new_spec == 0) return;
    motor_state[group][motor].spec = *new_spec;
}
